#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <mqueue.h>

#define MSG_LEN 32

void signal_handble(int sig)
{
    // 清除队列
    printf("清除队列\n");
    mq_unlink("/tese_mq");
    exit(EXIT_SUCCESS);
}

int main(int argc, char const *argv[])
{
    // 主持一个信号
    signal(SIGINT, signal_handble);
    signal(SIGTERM, signal_handble);
    // 复制一个子进程
    pid_t pid = fork();
    // 判断是否创建成功
    if (pid < 0)
    {
        // 创建失败
        perror("子进程创建失败");
        exit(EXIT_FAILURE);
    }

    if (pid == 0)
    {
        // 子进程
        // 创建消息队列
        // 设置退列配置
        struct mq_attr attr;
        // 队列最多多所个消息
        attr.mq_maxmsg = 10;
        // 每条消息多少个字节
        attr.mq_msgsize = MSG_LEN;
        mqd_t mp = mq_open("/tese_mq", O_CREAT | O_RDWR | O_APPEND, 0666, &attr);
        // 判断是否打开成功
        if (mp < 0)
        {
            perror("queue创建失败");
            exit(EXIT_FAILURE);
        }

        // 接受队列厘米的消息
        char array[MSG_LEN];
        while (1)
        {
            int result = mq_receive(mp, array, MSG_LEN, 0);
            printf("%s\n",array);
            if (result < 0)
            {
                perror("读取失败");
                exit(EXIT_FAILURE);
            }
        }
    }
    else
    {
        // 父进程
        // 创建消息队列
        // 设置退列配置
        struct mq_attr attr;
        // 队列最多多所个消息
        attr.mq_maxmsg = 10;
        // 每条消息多少个字节
        attr.mq_msgsize = MSG_LEN;
        mqd_t mp = mq_open("/tese_mq", O_CREAT | O_RDWR | O_APPEND, 0666, &attr);
        // 判断是否打开成功
        if (mp < 0)
        {
            perror("queue创建失败");
            exit(EXIT_FAILURE);
        }
        // 发送消息
        char array[MSG_LEN];
        int i = 0;
        while (1)
        {
            i++;
            sprintf(array, "nice to meet you %d", i);
            mq_send(mp, array, MSG_LEN, 0);
            // 等待一户ui
            sleep(2);
        }
    }
    return 0;
}
